package com.module.aichat.repo

import com.module.aichat.db.ReportChatManager
import com.module.aichat.db.table.DBMessage
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.flatMapLatest
import kotlinx.coroutines.flow.flowOf
import kotlinx.coroutines.launch

/**
 * 作者：sosou
 * <p>
 * 版本：1.0
 * <p>
 * 创建日期：2025/6/30
 * <p>
 * 描述：仓库类，所有会话相关的数据操作都在此类中进行，数据库的增、删、改、查操作
 * <p>
 * 修订历史：
 */
class ChatMessageRepo private constructor() {
    companion object {
        val instance by lazy(mode = LazyThreadSafetyMode.SYNCHRONIZED) { ChatMessageRepo() }
    }

    private val dao = ReportChatManager.chatMessageDao

    private val scope = CoroutineScope(Dispatchers.IO)

    private val refreshTrigger = MutableStateFlow(0)

    /**
     * 查找所有数据
     */
    fun findAllByStatus(status: Int): List<DBMessage>? {
        //数据库查找所有数据
        return dao?.findAllByStatus(status)
    }


    /**
     * 查找所有数据
     */
    @OptIn(ExperimentalCoroutinesApi::class)
    fun findAllByStatusFlow(status: Int): Flow<List<DBMessage>> = refreshTrigger.flatMapLatest {
        dao?.findAllByStatusFlow(status) ?: flowOf(emptyList())
    }

    /**
     * 查找所有数据
     */
    fun findAll(): MutableList<DBMessage>? {
        //数据库查找所有数据
        return dao?.findAllOrderByTimeAsc()
    }

    /**
     * 查找所有数据
     */
    @OptIn(ExperimentalCoroutinesApi::class)
    fun findAllFlow(): Flow<List<DBMessage>> = refreshTrigger.flatMapLatest {
        dao?.findLatestDayFlow() ?: flowOf(emptyList())
    }

    /**
     * 根据时间范围查询数据
     */
    fun findByTimeRange(startTime:Long, endTime:Long): List<DBMessage>? {
        //数据库查找所有数据
        return dao?.findByTimeRange(startTime,endTime)
    }

    /**
     * 根据时间范围查询数据（Flow版本）
     */
    @OptIn(ExperimentalCoroutinesApi::class)
    fun findByTimeRangeFlow(startTime:Long, endTime:Long): Flow<List<DBMessage>> = refreshTrigger.flatMapLatest { dao?.findByTimeRangeFlow(startTime,endTime) ?: flowOf(emptyList()) }

    /**
     * 插入数据
     */
    fun add2DB(data: DBMessage?) {
        data?.let {
            scope.launch {
                dao?.insert(it)
            }
        }
    }


    /**
     * 删除数据库中数据
     */
    fun delAll2DB() {
        scope.launch {
            dao?.deleteAll()
        }
    }

    fun insertDistinct(mList: List<DBMessage>, batchSize: Int = 500) {
        if (mList.isNullOrEmpty()) return
        scope.launch {
            // 分批处理
            mList.chunked(batchSize).forEach { batch ->
                dao?.insert(batch) // 直接插入整个批次
            }
        }
    }

    /**
     * 自动触发 Flow 的更新，进而更新 LiveData
     */
    fun refreshData() {
        refreshTrigger.value += 1  // 增加触发器的值，这会导致 Flow 重新发射
    }

}